package initializer

import (
	"go_ruoyi/global"
	"log"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
)

func InitMysql() {
	host := global.Viper.GetString("mysql.host")
	port := global.Viper.GetString("mysql.port")
	user := global.Viper.GetString("mysql.user")
	password := global.Viper.GetString("mysql.password")
	database := global.Viper.GetString("mysql.database")
	maxIdleConns := global.Viper.GetInt("mysql.maxIdleConns")
	maxOpenConns := global.Viper.GetInt("mysql.maxOpenConns")
	dsn := user + ":" + password + "@tcp(" + host + ":" + port + ")/" + database + "?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.New(mysql.Config{
		DSN:                       dsn,   // DSN data source name
		DefaultStringSize:         256,   // string 类型字段的默认长度
		DisableDatetimePrecision:  true,  // 禁用 datetime 精度，MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true,  // 重命名索引时采用删除并新建的方式，MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true,  // 用 `change` 重命名列，MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
	}), &gorm.Config{
		// SkipDefaultTransaction: true, //开启跳过默认事务
		NamingStrategy: schema.NamingStrategy{
			// TablePrefix:   "gorm_", //表名前缀
			SingularTable: true, //单数表明（就是表名后面带不带S）
			// NoLowerCase:   false,   //是否禁用小写
		},
		//Logger: nil, //全局日志
		// DisableForeignKeyConstraintWhenMigrating: true, //禁用外键约束,不用实体外键
	})
	if err != nil {
		log.Fatalln("数据库初始化err:", err)
	}

	sqlDB, err := db.DB()
	if err != nil {
		log.Fatalln("连接池初始化err:", err)
	}

	//设置空闲连接池中最大连接数
	sqlDB.SetMaxIdleConns(maxIdleConns)

	//设置数据库的最大打开连接数。
	sqlDB.SetMaxOpenConns(maxOpenConns)

	//设置一个连接可能被重用的最大时间
	sqlDB.SetConnMaxLifetime(time.Hour)

	global.DB = db

}
